/**
 * 
 */
package edu.acatlan.unam.shared.bdoo;

//Librerías de la clase
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.NotPersistent;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.gwt.canvas.dom.client.Context2d;
//import com.google.gwt.canvas.dom.client.CssColor;

import java.io.Serializable;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

/**
 * @author jacobo
 *
 */
@SuppressWarnings("serial")
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class TRelacion implements Serializable, ModeloRelacional, ElementoGrafico {
	//Propiedades de la clase
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Long idRelacion;
	@Persistent
	private String nombreRelacion;
	@Persistent
	private Long idTablaPropietaria;
	@Persistent
	private Long idTablaReferencia;
	@Persistent
	private Map<Long, Long> columnas;
	@Persistent
	private Integer posX, posX2;
	@Persistent
	private Integer posY, posY2;
	@NotPersistent
	private String nomTablaProp;
	@NotPersistent
	private String nomTablaRef;
	@NotPersistent
	private Map<String, String> nomColumnas;
	
	/**
	 * Constructor de la clase
	 */
	public TRelacion() {
		
	}

	/**
	 * @param nombreRelacion es el nombre de la relación
	 * @param idTablaPropietaria es el identificador de la tabla dueña de la relación
	 * @param idTablaReferencia es el identificador de la tabla a la que hace referencia
	 * @param columnas es el arreglo de pares de columnas que forman la referencia 
	 */
	public TRelacion(String nombreRelacion, Long idTablaPropietaria,
			Long idTablaReferencia, Map<Long, Long> columnas) {
		this.nombreRelacion = nombreRelacion;
		this.idTablaPropietaria = idTablaPropietaria;
		this.idTablaReferencia = idTablaReferencia;
		this.columnas = columnas;
	}

	/**
	 * @return the idRelacion
	 */
	public Long getIdRelacion() {
		return idRelacion;
	}

	/**
	 * @param idRelacion the idRelacion to set
	 */
	public void setIdRelacion(Long idRelacion) {
		this.idRelacion = idRelacion;
	}

	/**
	 * @return the nombreRelacion
	 */
	public String getNombreRelacion() {
		return nombreRelacion;
	}

	/**
	 * @param nombreRelacion the nombreRelacion to set
	 */
	public void setNombreRelacion(String nombreRelacion) {
		this.nombreRelacion = nombreRelacion;
	}

	/**
	 * @return the idTablaPropietaria
	 */
	public Long getIdTablaPropietaria() {
		return idTablaPropietaria;
	}

	/**
	 * @param idTablaPropietaria the idTablaPropietaria to set
	 */
	public void setIdTablaPropietaria(Long idTablaPropietaria) {
		this.idTablaPropietaria = idTablaPropietaria;
	}

	/**
	 * @return the idTablaReferencia
	 */
	public Long getIdTablaReferencia() {
		return idTablaReferencia;
	}

	/**
	 * @param idTablaReferencia the idTablaReferencia to set
	 */
	public void setIdTablaReferencia(Long idTablaReferencia) {
		this.idTablaReferencia = idTablaReferencia;
	}

	/**
	 * @return the columnas
	 */
	public Map<Long, Long> getColumnas() {
		return columnas;
	}

	/**
	 * @param columnas the columnas to set
	 */
	public void setColumnas(Map<Long, Long> columnas) {
		this.columnas = columnas;
	}

	/* (non-Javadoc)
	 * @see edu.acatlan.unam.shared.bdoo.ModeloRelacional#getCadenaDLL()
	 */
	public String getCadenaDLL() {
		String c = "CONSTRAINT '" + this.nombreRelacion + "'<br/>" +
				"FOREIGN KEY (";
		
		Iterator<Entry<String, String>> it = nomColumnas.entrySet().iterator();
		
		while(it.hasNext()) {
			//Obtenemos las columnas de la tabla propietaria de la llave.
			Map.Entry<String, String> e = (Map.Entry<String, String>)it.next();
			c += "'" + e.getKey() + "', ";
		}
		
		c = c.substring(0, c.length() - 2) + ")<br/>";
		c += "REFERENCES '" + nomTablaRef + "' (";
		it = nomColumnas.entrySet().iterator();
		
		while(it.hasNext()) {
			//Obtenemos las columnas de la tabla a la que se hace referencia.
			Map.Entry<String, String> e = (Map.Entry<String, String>)it.next();
			c += "'" + e.getValue() + "', ";
		}
		
		c = c.substring(0, c.length() - 2) + ")<br/>";
		c += "ON DELETE NO ACTION<br/>" + 
		"ON UPDATE NO ACTION";
		
		return c;
	}

	/* (non-Javadoc)
	 * @see edu.acatlan.unam.shared.bdoo.ElementoGrafico#getPosX()
	 */
	public int getPosX() {
		return posX.intValue();
	}

	/* (non-Javadoc)
	 * @see edu.acatlan.unam.shared.bdoo.ElementoGrafico#getPosY()
	 */
	public int getPosY() {
		return posY.intValue();
	}
	
	/**
	 * @return retorna la componente X de la posición final
	 */
	public int getPosX2() {
		return posX2.intValue();
	}
	
	/**
	 * @return retorna la componente Y de la posición final
	 */
	public int getPosY2() {
		return posY2.intValue();
	}
	
	/* (non-Javadoc)
	 * @see edu.acatlan.unam.shared.bdoo.ElementoGrafico#setPosicion(int, int)
	 */
	public void setPosicion(int cx, int cy) {
		this.posX = cx;
		this.posY = cy;
	}
	
	/**
	 * @param cx es la componente X de la coordenada final
	 * @param cy es la componente Y de la coordenada final
	 */
	public void setPosicionFinal(int cx, int cy) {
		this.posX2 = cx;
		this.posY2 = cy;
	}
	
	/* (non-Javadoc)
	 * @see edu.acatlan.unam.shared.bdoo.ElementoGrafico#estaBajo(int, int)
	 */
	public boolean estaBajo(int mouseX, int mouseY) {
		return false;
	}

	/**
	 * @return the nomTablaProp es el nombre de la tabla propietaria de la relación
	 */
	public String getNomTablaProp() {
		return nomTablaProp;
	}

	/**
	 * @param nomTablaProp the nomTablaProp to set
	 */
	public void setNomTablaProp(String nomTablaProp) {
		this.nomTablaProp = nomTablaProp;
	}

	/**
	 * @return the nomTablaRef que es el nombre de la tabla a referenciar
	 */
	public String getNomTablaRef() {
		return nomTablaRef;
	}

	/**
	 * @param nomTablaRef the nomTablaRef to set
	 */
	public void setNomTablaRef(String nomTablaRef) {
		this.nomTablaRef = nomTablaRef;
	}

	/**
	 * @return the nomColumnas
	 */
	public Map<String, String> getNomColumnas() {
		return nomColumnas;
	}

	/**
	 * @param nomColumnas the nomColumnas to set
	 */
	public void setNomColumnas(Map<String, String> nomColumnas) {
		this.nomColumnas = nomColumnas;
	}

	/* (non-Javadoc)
	 * @see edu.acatlan.unam.shared.bdoo.ElementoGrafico#dibuja(com.google.gwt.canvas.dom.client.Context2d)
	 */
	public void dibuja(Context2d contexto) {
		//TODO: Mejorar el dibujo de la relación.
		contexto.setLineWidth(3);
		contexto.setStrokeStyle("#000000");
		
		contexto.moveTo(posX, posY);
		contexto.lineTo(posX2, posY2);
	}
}
